import os

from django.core.files.storage import Storage
from django.conf import settings
from fdfs_client.client import Fdfs_client


class FastDFSStorage(Storage):
    """自定义文件存储类"""

    def __init__(self, client_conf=None, fdfs_base_url=None):
        """文件存储类的初始化方法"""
        # if not fdfs_base_url:
        #     self.fdfs_base_url = settings.FDFS_BASE_URL
        # self.fdfs_base_url = fdfs_base_url
        # self.fdfs_base_url = fdfs_base_url or settings.FDFS_BASE_URL
        if client_conf is None:
            client_conf = settings.FDFS_BASE_CONF_PATH
        self.client_conf = client_conf

        if fdfs_base_url is None:
            fdfs_base_url = settings.FDFS_BASE_URL
        self.fdfs_base_url = fdfs_base_url

    def _open(self, name, mode='rb'):
        """
        打开文件时会被调用的：文档告诉我必须重写
        :param name: 文件路径
        :param mode: 文件打开方式
        :return: None
        """
        # 因为当前不是去打开某个文件，所以这个方法目前无用，但是又必须重写，所以pass
        pass

    def _save(self, name, content):
        """
        PS：将来后台管理系统中，需要在这个方法中实现文件上传到FastDFS服务器
        保存文件时会被调用的：文档告诉我必须重写
        :param name: 文件路径
        :param content: 文件二进制内容
        :return: None
        """
        # 因为当前不是去保存文件，所以这个方法目前无用，但是又必须重写，所以pass
        """
                保存文件时使用
                name ：你选择的上传文件的名称
                content：包含你上传文件内容的File对象
                """

        # 创建一个fdfs_client 对象
        client = Fdfs_client(self.client_conf)

        # 上传文件
        res = client.upload_by_buffer(content.read())
        """
         @return dict {
            'Group name'      : group_name,
            'Remote file_id'  : remote_file_id,
            'Status'          : 'Upload successed.',
            'Local file name' : '',
            'Uploaded size'   : upload_size,
            'Storage IP'      : storage_ip
        } if success else None
        """
        if res.get("Status") != "Upload successed.":
            # 上传失败
            raise Exception("上传文件到Fast dfs失败")
        # 获取返回的额文件ID
        filename = res.get("Remote file_id")

        return filename

    def exists(self, name):
        """Django 判断文件名是否可用"""
        return False

    def url(self, name):
        """
        返回文件的全路径
        :param name: 文件相对路径
        :return: 文件的全路径（http://192.168.103.158:8888/group1/M00/00/00/wKhnnlxw_gmAcoWmAAEXU5wmjPs35.jpeg）
        """
        str = self.fdfs_base_url + name
        return str.replace('\\', '/')

        # return 'http://192.168.186.134:8888/' + name
